/* eslint-disable n/no-unsupported-features/es-syntax */
/* eslint-disable @typescript-eslint/no-explicit-any */
function LogParameters(): ParameterDecorator {
  console.log("LogParameters decorator invoked");
  return function (target: any, methodName, parameterIndex: number) {
    // eslint-disable-next-line no-eq-null, eqeqeq
    if (methodName == null) {
      return;
    }
    // 记录参数索引和参数名（假设已启用 emitDecoratorMetadata）
    console.log("LogParameters decorator called");
    const paramTypes = Reflect.getMetadata(
      "design:paramtypes",
      target,
      methodName,
    );
    const paramName = paramTypes?.[parameterIndex]?.name || "unknown";
    console.log(`参数 ${parameterIndex} (${paramName}) 被装饰`);
  };
}
class Calculator {
  static {
    console.log("Calculator static block");
  }

  // 参数装饰器在定义时被调用(初始化),
  // 参数装饰器全部调用完成后开始装饰
  add(@LogParameters() a: number, @LogParameters() b: number): number {
    return a + b;
  }
}

console.log("--------");
const c: Calculator = new Calculator();
console.log("--------");

c.add(1, 2);
// 输出:
// 参数 0 (Number) 被装饰
// 参数 1 (Number) 被装饰
